/**
 * 
 */
package webcrawler;

import java.io.File;

import java.net.URL;

import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Jose Antonio Romero
 *
 */
public class Url {
	
	//Identificador
	int identificador;
	//Url
	String direccion;
	//Protocolo mas host 
    public String protocoloHost = null;
    
     //Parte del path de la url, quitando protocolo, host y el fichero.
    public String path = null;
    // Nombre del fichero en la url 
    public String fichero = null;


	

	public int getIdentificador() {
		return identificador;
	}

	public void setIdentificador(int identificador) {
		this.identificador = identificador;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	/**
	 * 
	 */
	public Url() {
		// TODO Auto-generated constructor stub
	}
	
    /**
     * Devuelve un String con todas las partes de la url concatenadas.
     */
    public String toString() {
            return protocoloHost + " " + path + " " + fichero;
    }
    
    /**
     * Convierte un href relativo en absoluto.<br>
     * Se le pasa una urlDescompuesta con los datos del Host de donde se esta
     * intentando descargar los ficheros y un String con un href extraido
     * directamente de la pagina html.<br>
     * Revisa si href es ya una url absoluta (empieza por http) y si no lo es,
     * le anade la parte de protocolo y host de urlDescompuesta. Devuelve una
     * href absoluta.
     * 
     * @param urlDescompuesta
     *            URL de la pagina html de la que se intentan descargar los
     *            ficheros.
     * @param href
     *            un enlace extraido directamente del html.
     * @return el href convertido a url absoluta.
     */
    private static String convierteHrefRelativaEnAbsoluta(
                    Url urlDescompuesta, String href) {
            if (href.toLowerCase().startsWith("http"))
                    return href;
            if (href.startsWith("/"))
                    return urlDescompuesta.protocoloHost + href;

            return urlDescompuesta.protocoloHost + urlDescompuesta.path + "/"
                            + href;
    }
    
    /**
     * Devuelve la lista de href dentro de la pagina html que se le pasa. Se le
     * pasa la direccion de la pagina original de forma que pueda devolver todos
     * los enlaces como referencias absolutas, anadiendo la url original a los
     * enlaces relativos.
     * 
     * @param url
     *            Direccion de la pagina original
     * @param textoHtml
     *            Texto html de la pagina.
     * @return Lista de enlaces absolutos.
     */
    public static List<String> getEnlaces(URL url, String textoHtml) {

            LinkedList<String> enlaces = new LinkedList<String>();
            Url urlDescompuesta = getURLDescompuesta(url);

            // Se busca el tag base de html para tenerlo en cuenta.
            // De momento no se hace nada con el, asi que no funciona
            // bien en caso de que dicho tag exista.
            Pattern pBase = Pattern
                            .compile("< *[Bb][Aa][Ss][Ee] *[hH][rR][eE][fF] *= *[\"']?([^ \"'>])[\"'>]");
            Matcher mBase = pBase.matcher(textoHtml);
            if (mBase.find()) {
                    System.out.println(mBase.group(1));
            }

            // Se busca href por el texto html
            Pattern pHref = Pattern
                            .compile("[hH][rR][eE][fF] *= *[\"']?([^ \"'>]*)[\"'>]");
            Matcher mHref = pHref.matcher(textoHtml);

            // Para cada href encontrado
            while (mHref.find()) {
                    // se convierte en url absoluta
                    String href = convierteHrefRelativaEnAbsoluta(urlDescompuesta,
                                    mHref.group(1));
                    enlaces.add(href.replace("\\", "/"));
            }
            return enlaces;
    }
    
    /**
     * Se le pasa una URL y la devuelve descompuesta en tres cachos: protocolo y
     * host + path del fichero + nombre del fichero. Considera que hay fichero
     * si tiene extension. Si no tiene extension, entonces supone que es un
     * directorio.
     * 
     * @param url
     * @return
     */
    private static Url getURLDescompuesta(URL url) {
            Url temp = new Url();

            // protocolo y host
            temp.protocoloHost = url.getProtocol() + "://" + url.getHost();

            // Parte del path
            File f = new File(url.getPath());
            temp.path = f.getParent();

            // Parte del fichero
            temp.fichero = f.getName();

            // Si el fichero no tiene extension, se considera que es un
            // directorio y forma parte del path, por lo que se rehace
            // el path y se deja fichero a null.
            if (-1 == temp.fichero.indexOf(".")) {
                    temp.path += "/" + temp.fichero;
                    temp.fichero = null;
            }
            return temp;
    }
    
  

}
